package com.qq.open.weibo;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.qq.open.common.OpenQqConstants;
import com.qq.open.common.OpenQqUtils;
import com.qq.open.common.json.JSONArray;
import com.qq.open.common.json.JSONException;
import com.qq.open.common.json.JSONObject;
import com.qq.open.weibo.bean.param.WeiBoGetInfoParamBean;
import com.qq.open.weibo.bean.result.WeiBoEduResultBean;
import com.qq.open.weibo.bean.result.WeiBoGetInfoResultBean;
import com.qq.open.weibo.bean.result.WeiBoTagResultBean;

/**
 * 获取腾讯微博登录用户的用户资料
 * 
 * @author HaoLiang
 *
 */
public class WeiBoGetInfo {

	/** QQ互联工具类 */
	private OpenQqUtils oqu = new OpenQqUtils(); 
	
	/** 日志 */
	private Logger log = Logger.getLogger(WeiBoGetInfo.class);
	
	
	/**
	 * 获取登陆用户资料
	 * 
	 * @param paramBean 参数
	 * @return 接口返回数据
	 * @throws JSONException 
	 * @throws IOException 
	 */
	public WeiBoGetInfoResultBean getInfo(WeiBoGetInfoParamBean paramBean) throws IOException, JSONException {
		
		// 日志
		log.info("获取登陆用户的微博资料 开始...");
		
		// 获取接口URL
		String interfaceUrl = this.getIngerfaceUrl(paramBean);
		
		// 请求接口，接收接口返回的json数据
		String jsonData = oqu.doGet(interfaceUrl);
		
		// 微博资料
		WeiBoGetInfoResultBean resultBean = null;
		try {
			resultBean = this.jsonToBean(jsonData);
		} catch (JSONException e) {
			e.printStackTrace();
			// 日志
			log.error("getInfo 异常，json数据是：" + jsonData);
			throw e;
		}
		
		// 日志
		log.info("获取登陆用户的微博资料 结束...");
		
		return resultBean;
	}
	
	
	/**
	 * 获取登陆用接口地址
	 * 
	 * @param paramBean 参数
	 * @return 接口地址
	 */
	private String getIngerfaceUrl(WeiBoGetInfoParamBean paramBean) {
		
		// 接口URL
		StringBuilder interfaceUrl = new StringBuilder();
		
		// 获取登录用户收听的人的列表 接口URL
		interfaceUrl.append(OpenQqConstants.WEIBO_GET_INFO_URL);
		
		// AccessToken
		interfaceUrl.append("?access_token=" + paramBean.getAccessToken());
		
		// AppId
		interfaceUrl.append("&oauth_consumer_key=" + oqu.getConfigValue("qq.appid"));
		
		// OpenId
		interfaceUrl.append("&openid=" + paramBean.getOpenId());
		
		// 定义API返回的数据格式。
		interfaceUrl.append("&format=json");
		
		return interfaceUrl.toString();
		
	}
	
	
	/**
	 * 把接口返回的json数据转换成JavaBean
	 * 
	 * @param jsonData 接口返回的数据
	 * @return JavaBean数据
	 * @throws JSONException 
	 */
	private WeiBoGetInfoResultBean jsonToBean(String jsonData) throws JSONException {
		
		WeiBoGetInfoResultBean resultBean = new WeiBoGetInfoResultBean();
		
		// 格式化json数据
		JSONObject jsonObjRoot = new JSONObject(jsonData);
		
		// 接口返回出错的场合
		if (jsonObjRoot.getInt("ret") != 0) {
			
			// 设置错误标识
			resultBean.setErrorFlg(true);
			
			// 错误编号
			resultBean.setErrorCode(jsonObjRoot.get("errcode").toString());
			
			// 错误信息
			resultBean.setErrorMes(jsonObjRoot.getString("msg"));
		} else {
			
			// 他用户详细信息
			JSONObject jsonDataObj = new JSONObject(jsonObjRoot.getJSONObject("data").toString());
			
			// 其他用户的帐号名
			resultBean.setName(jsonDataObj.getString("name"));
			
			// 其他用户的唯一ID
			resultBean.setOpenId(jsonDataObj.getString("openid"));
			
			// 其他用户昵称
			resultBean.setNick(jsonDataObj.getString("nick"));
			
			// 其他用户头像url
			resultBean.setHead(jsonDataObj.getString("head"));
			
			// 其他用户所在地
			resultBean.setLocation(jsonDataObj.getString("location"));
			
			// 其他用户是否为微博认证用户
			resultBean.setIsvip(jsonDataObj.get("isvip").toString());
			
			// 其他用户是否为企业机构
			resultBean.setIsent(jsonDataObj.get("isent").toString());
			
			// 其他用户的个人介绍
			resultBean.setIntroduction(jsonDataObj.getString("introduction"));
			
			// 认证信息
			resultBean.setVerifyInfo(jsonDataObj.getString("verifyinfo"));
			
			// 其他用户出生年
			resultBean.setBirthYear(jsonDataObj.get("birth_year").toString());
			
			// 其他用户出生月份
			resultBean.setBirthMonth(jsonDataObj.get("birth_month").toString());
			
			// 其他用户出生日
			resultBean.setBirthDay(jsonDataObj.get("birth_day").toString());
			
			// 其他用户所在的国家代码
			resultBean.setCountryCode(jsonDataObj.get("country_code").toString());
			
			// 其他用户所在的省代码
			resultBean.setProvinceCode(jsonDataObj.get("province_code").toString());
			
			// 其他用户所在的城市代码
			resultBean.setCityCode(jsonDataObj.get("city_code").toString());
			
			// 其他用户性别
			resultBean.setSex(jsonDataObj.get("sex").toString());
			
			// 其他用户听众数
			resultBean.setFansNum(jsonDataObj.get("fansnum").toString());
			
			// 其他用户收听的人数
			resultBean.setIdolNum(jsonDataObj.get("idolnum").toString());
			
			// 其他用户发表的微博数
			resultBean.setTweetNum(jsonDataObj.get("tweetnum").toString());
			
			// 用户注册的邮箱
			resultBean.setEmail(jsonDataObj.getString("email"));
			
			if (!"null".equals(jsonDataObj.get("tag").toString())) {
				// 听众标签集合
				List<WeiBoTagResultBean> tagsList = new ArrayList<WeiBoTagResultBean>();
				
				// 听众标签
				JSONArray tagsArray = jsonDataObj.getJSONArray("tag");
				
				for (int j = 0; j < tagsArray.length(); j++) {
					WeiBoTagResultBean tagsBean = new WeiBoTagResultBean();
					// 听众标签
					JSONObject tagsObject = new JSONObject(tagsArray.get(j).toString());
					
					// 标签ID
					tagsBean.setId(tagsObject.getString("id"));
					
					// 标签名
					tagsBean.setName(tagsObject.getString("name"));
					
					tagsList.add(tagsBean);
				}
				resultBean.setTagsList(tagsList);
			}
			
			if (!"null".equals(jsonDataObj.get("edu").toString())) {
				
				List<WeiBoEduResultBean> edusList = new ArrayList<WeiBoEduResultBean>();
				
				// 听众标签
				JSONArray edusArray = jsonDataObj.getJSONArray("edu");
				
				for (int j = 0; j < edusArray.length(); j++) {
					WeiBoEduResultBean edusBean = new WeiBoEduResultBean();
					// 听众标签
					JSONObject edusObject = new JSONObject(edusArray.get(j).toString());
					
					// 教育信息记录ID
					edusBean.setId(edusObject.get("id").toString());
					
					// 入学年
					edusBean.setYear(edusObject.get("year").toString());
					
					// 学校ID
					edusBean.setSchoolId(edusObject.get("schoolid").toString());
					
					// 院系ID
					edusBean.setDepartmentId(edusObject.get("departmentid").toString());
					
					// 学历级别
					edusBean.setLevel(edusObject.get("level").toString());
					
					edusList.add(edusBean);
				}
				resultBean.setEdusList(edusList);
			}
		}
		
		return resultBean;
	}
}
